package controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JOptionPane;

import model.AfbeeldingItem;
import model.Constants;
import model.ItemKenmerken;
import model.ItemNiveau;
import model.Presentatie;
import model.Presenteerbaar;
import model.Slide;
import model.SlideItem;
import model.TekstItem;
import view.HoofdScherm;
import view.themas.ThemaFactory;

/**
 * 
 * klasse die verantwoordelijk is voor het laden en bewaren van presentaties in
 * tekstformaat
 *
 */
public class TekstOpslag implements Opslag {

	//bewaren van een presentatie in tekstformaat
	@Override
	public void bewaarPresentatie(File file) {
		
		//keer terug als er geen bestandsnaam wordt opgegeven
		if (file == null) {
			return;
			}

		PrintWriter out = null;

		try {
			FileWriter writer = new FileWriter(file);
			out = new PrintWriter(writer);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null,
					Constants.FOUT + e.getMessage(), Constants.FOUTTITEL,
					JOptionPane.ERROR_MESSAGE);
		}
		
		//thema bewaren
		out.println(PresentatieController.presentatie.getThema().getThemaNaam());
		
		//we gaan alle slides af
		for (Presenteerbaar item : PresentatieController.presentatie.getItems()) {

			Slide slide = (Slide) item;

			out.println(item.getKenmerken().getNiveau().getValue());
			out.println(item.getKenmerken().getSpeciaalItem());
			
			//en bewaren de slideItems
			for (Presenteerbaar item2 : slide.getItems()) {

				SlideItem slideItem = (SlideItem) item2;
				if (slideItem instanceof TekstItem) {
					out.println(Constants.TEKST_ITEM);
					out.println(((TekstItem) slideItem).getTekst());
				} else {
					out.println(Constants.AFBEELDING_ITEM);
					out.println(((AfbeeldingItem) slideItem)
							.getAfbeeldingLocatie());
				}
				out.println(slideItem.getKenmerken().getNiveau().getValue());
				out.println(slideItem.getKenmerken().getSpeciaalItem());

			}
		}
		out.close();

		JOptionPane.showMessageDialog(null,
				Constants.PRESENTATIE + file.getName() + Constants.BEWAARD);
	}
	//laadt een presentatie die is opgeslagen als tekstformaat
	@Override
	public void laadPresentatie(File file) {

		Presentatie presentatie = new Presentatie();
		SlideItemFactory slideItemFactory = new SlideItemFactory();
		ThemaFactory themaFactory = new ThemaFactory();
		boolean demo = false;
		//als er geen bestandsnaam is opgegeven, wordt demo geladen
		if (file == null) {
			file = new File(Constants.DEMO_BESTAND_TXT);
			JOptionPane.showMessageDialog(null, Constants.DEMO_LADEN);
			demo = true;
		}

		BufferedReader in = null;
		try {
			FileReader inputFile = new FileReader(file);
			in = new BufferedReader(inputFile);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null,
					Constants.FOUT + e.getMessage(), Constants.FOUTTITEL,
					JOptionPane.ERROR_MESSAGE);
		}

		try {
			String themaNaam = in.readLine();

			switch (themaNaam) {
			case (Constants.STANDAARDTHEMA):
				presentatie.setThema(themaFactory.createDefaultThema());
				break;
			case (Constants.COLORFULLTHEMA):
				presentatie.setThema(themaFactory.createColorFullThema());
				break;
			case (Constants.COMPLEXTHEMA):
				presentatie.setThema(themaFactory.createComplexThema());
				break;
			default:
				presentatie.setThema(themaFactory.createDefaultThema());
			}

			String soortItem = in.readLine();
			
			//zolang het soortItem een slide is
			while (soortItem != null && soortItem.equals("2")) {

				Slide slide = new Slide();
				ItemKenmerken itemKenmerken = new ItemKenmerken();
				String speciaalItem = in.readLine();
				if (speciaalItem.equals(Constants.FALSE)) {
					itemKenmerken.setSpeciaalItem(false);
				} else {
					itemKenmerken.setSpeciaalItem(true);
				}

				itemKenmerken.setNiveau(ItemNiveau.Slide);
				slide.setKenmerken(itemKenmerken);

				SlideItem slideItem = null;
				soortItem = in.readLine();
				String itemNiveau = null;

				while (soortItem != null && !soortItem.equals("2")) {
					itemKenmerken = new ItemKenmerken();
					slideItem = null;
					switch (soortItem) {
					case (Constants.TEKST_ITEM):
						slideItem = slideItemFactory.createTekstItem(in
								.readLine());
						break;
					case (Constants.AFBEELDING_ITEM):
						slideItem = slideItemFactory.createAfbeeldingItem(in
								.readLine());
						break;
					default:
					}

					itemNiveau = in.readLine();

					switch (itemNiveau) {
					case ("3"):
						itemKenmerken.setNiveau(ItemNiveau.Titel);
						break;
					case ("4"):
						itemKenmerken.setNiveau(ItemNiveau.Niveau1Item);
						break;
					case ("5"):
						itemKenmerken.setNiveau(ItemNiveau.Niveau2Item);
						break;
					case ("6"):
						itemKenmerken.setNiveau(ItemNiveau.Niveau3Item);
						break;
					}

					speciaalItem = in.readLine();
					if (speciaalItem.equals(Constants.FALSE)) {
						itemKenmerken.setSpeciaalItem(false);
					} else {
						itemKenmerken.setSpeciaalItem(true);
					}

					slideItem.setKenmerken(itemKenmerken);
					slide.voegItemToe(slideItem);
					soortItem = in.readLine();
				}
				presentatie.voegItemToe(slide);
			}

			in.close();

		} catch (IOException e) {
			JOptionPane.showMessageDialog(null,
					Constants.FOUT + e.getMessage(), Constants.FOUTTITEL,
					JOptionPane.ERROR_MESSAGE);
		}

		presentatie.setThema(presentatie.getThema());
		PresentatieController.presentatie = presentatie;
		presentatie.addObserver(HoofdScherm.getInstance());
		presentatie.gaNaar(1);
		HoofdScherm.getInstance().setTitelPresentatie(file.getName());

		if (!demo) {
			JOptionPane.showMessageDialog(HoofdScherm.getInstance(),
					Constants.PRESENTATIE + file.getName() + Constants.GELADEN);
		}
	}

}
